from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference


class Barchart:
    """
    这是对openpyxl中的BarChart图形进行简单的封装。
    """
    def __init__(self):
        self.wb = Workbook(write_only=True)
        self.sheet_wb = self.wb.create_sheet()

    def add_chart(self, data=None, title=None, position=None):
        for _data in data:
            self.sheet_wb.append(_data)

        # col指定列表min到max行的数据类型（第1列都是主题名，第2列以后才是数据，一般从第2列开始到结尾）。
        # row指定列表数据从min到max行（如果侧面属性标题包含在列表中并且是第1行则min需要从1开始）。
        data = Reference(self.sheet_wb, min_col=2, max_col=len(data[0]), min_row=1, max_row=len(data))
        # col指定主题名处于那一列，一般是第一列表示主题；主题名数据从min_row到max_row，一般是从第2列开始。
        titles = Reference(self.sheet_wb, min_col=1, min_row=2, max_row=len(data))
        chart = BarChart()
        chart.title = title
        chart.add_data(data=data, titles_from_data=True)
        chart.set_categories(titles)
        self.sheet_wb.add_chart(chart, position)

    def save_chart(self, path):
        self.wb.save(path)


if __name__ == '__main__':
    s = Barchart()
    s.add_chart([
        ['ip', 'cpu', 'mem', 'clock'],
        ['1.1.1.1', 20, 40, '200'],
        ['2.2.2.2', 40, 60, '200'],
        ['3.3.3.3', 60, 80, '200'],
        ['4.4.4.4', 20, 40, '200'],
        ['5.5.5.5', 60, 80, '200'],
        ['6.6.6.6', 40, 60, '200'],
    ]
    ,'abc', 'H1')
    s.save_chart(r'g:\test.xlsx')